home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 November: Tool Chest / Dev.CD Nov 98 TC.toast / Sample Code / Snippets / Networking / AFP C++ / AFPSession.cp < prev    next >
Encoding:
Text File  |  1992-05-01  |  41.3 KB  |  2,145 lines  |  [TEXT/MPS ]

  1. /************************************************************
  2.  
  3. Created: Monday, Sept 23, 1991
  4.     AFPSession.cp
  5.     C++ Interface to the AppleTalk Filing Protocol
  6.     M.Vierling
  7.  
  8.  
  9.         Copyright Apple Computer, Inc. 1985-1991
  10.         All rights reserved
  11.  
  12. ************************************************************/
  13.  
  14. #include <Types.h>
  15. #include <CType.h>
  16. #include <Errors.h>
  17. #include <String.h>
  18. #include <Strings.h>
  19. #include "AFPSession.h"
  20.  
  21. typedef        MPPParamBlock    *MPPParamBlkPtr,    **MPPParamBlkHdl;    // CFront returns internal error: hased lookup if we don't typedef these - weird!
  22. typedef        MPPparms        *MPPparmsPtr,        **MPPparmsHdl;
  23. typedef        LAPparms        *LAPparmsPtr,        **LAPparmsHdl;
  24. typedef        DDPparms        *DDPparmsPtr,        **DDPparmsHdl;
  25. typedef        NBPparms        *NBPparmsPtr,        **NBPparmsHdl;
  26.  
  27. #pragma segment AFPCall
  28.  
  29. const unsigned short kMaxBufSize = 4096;
  30. const unsigned short kMinBufSize = 4;
  31.  
  32. TAFPSession::TAFPSession()
  33. {
  34.     this->Debug(0, "AFPSession constructor:");
  35.     
  36.     fCBStart = (Ptr)(new char[ kMaxBufSize ]);
  37.     fRBStart = (Ptr)(new char[ kMaxBufSize ]);
  38.  
  39.     fCBptr = fCBStart;
  40.     fRBptr = fRBStart;
  41.     
  42.     this->SetAFPVersion( "AFPVersion 2.1" );
  43.     
  44.     fPathDelimiter = ':';
  45. }
  46.  
  47.  
  48. OSErr TAFPSession::ISession( AddrBlock theAddress )
  49. {
  50.     this->Debug(0, "ISession");
  51.     this->SetAddress( theAddress );
  52.     return this->IAFPCall();
  53. }
  54.  
  55. TAFPSession::~TAFPSession()
  56. {
  57.     this->Debug(0, "AFPSession destructor:");
  58.     delete [] fCBStart;
  59.     delete [] fRBStart;
  60. }
  61.  
  62. void TAFPSession::SetAddress( AddrBlock theAddress )
  63. {
  64.     fafpAddrBlock = theAddress;
  65. }
  66.  
  67. AddrBlock TAFPSession::GetAddress()
  68. {
  69.     return fafpAddrBlock;
  70. }
  71.  
  72. inline OSErr TAFPSession::MakeAFPCall()
  73. {
  74.     return this->DoCommand( fCBStart, fCBSize, fRBStart, fRBSize );
  75. }
  76.  
  77. OSErr TAFPSession::GetError()
  78. {
  79.     return fErrResult;
  80. }
  81.  
  82. void TAFPSession::bytePush( Byte theByte )
  83. {
  84.     *fCBptr = theByte;
  85.     fCBptr++;
  86.     fCBSize = fCBptr - fCBStart;
  87. }
  88.  
  89. void TAFPSession::shortPush( short theShort )
  90. {
  91.     *(short *)fCBptr = theShort;
  92.     fCBptr += 2;
  93.     fCBSize = fCBptr - fCBStart;
  94. }
  95.  
  96. void TAFPSession::longPush( long theLong )
  97. {
  98.     *(long *)fCBptr = theLong;
  99.     fCBptr += 4;
  100.     fCBSize = fCBptr - fCBStart;
  101. }
  102.  
  103. void TAFPSession::arrayPush( char * arrayName, unsigned int arrayLen )
  104. {
  105.     memcpy( fCBptr, arrayName, arrayLen );
  106.     fCBptr += arrayLen;
  107.     fCBSize = fCBptr - fCBStart;
  108. }
  109.  
  110. void TAFPSession::stringPush( char * stringName )
  111. {
  112.     strcpy( fCBptr, stringName );
  113.     c2pstr( fCBptr );
  114.     fCBSize = strlen(stringName);    // temporarily use this since *fCBptr doesn't seem to work
  115.     fCBptr = fCBptr + fCBSize + 1;
  116.     fCBSize = fCBptr - fCBStart;
  117. }
  118.  
  119. void TAFPSession::pathPush( Byte PathType, char * Pathname )
  120. {
  121.     long count;
  122.     char* stringPtr;
  123.     
  124.     *(Byte *)fCBptr = PathType;
  125.     fCBptr += 1;
  126.     stringPtr = fCBptr;
  127.     this->stringPush( Pathname );
  128.     
  129.     count = strlen(Pathname);
  130.     for ( long i = 0; i < count; i++ )
  131.     {
  132.         stringPtr++;
  133.         if (*stringPtr == fPathDelimiter)
  134.             *stringPtr = '\0';
  135.     }
  136. }
  137.  
  138. void TAFPSession::passwordPush( char * Password )
  139. {
  140.     this->passwordCreate( (PassWord *)fCBptr, Password );
  141.     fCBptr += 8;        
  142.     fCBSize = fCBptr - fCBStart;
  143. }
  144.  
  145. void TAFPSession::passwordCreate( PassWord * password, char * string )
  146. {
  147.     long length, i;
  148.     char * myPtr;
  149.     
  150.     if (string == NULL)
  151.     {
  152.         length = 0;
  153.     }
  154.     else
  155.     {
  156.         length = strlen( string );
  157.         memcpy( password, string, 8 );
  158.     }
  159.     myPtr = (char *)password + length;
  160.     for (i = length; i < 8; i++)
  161.     {
  162.         *myPtr = '\0';
  163.         myPtr++;
  164.     }
  165. }
  166.  
  167. #ifdef __DES__
  168. void TAFPSession::desPush( PassWord * Key, PassWord * Password, Boolean useNewDES )
  169. {
  170.     KeysArray aKeyarray;
  171.     EncryptBlk theKey;
  172.     long *myPtr = nil;
  173.     EncryptBlk thePassword;
  174.  
  175.     myPtr = (long *)Key;
  176.     theKey[0] = *myPtr;
  177.     myPtr++;
  178.     theKey[1] = *myPtr;
  179.  
  180.     myPtr = (long *)Password;
  181.     thePassword[0] = *myPtr;
  182.     myPtr++;
  183.     thePassword[1] = *myPtr;
  184.  
  185.     myPtr = (long *)&thePassword;
  186.     
  187.     if (useNewDES)
  188.         LowBitsKeySched( (long *)theKey, aKeyarray );
  189.     else
  190.         HiBitsKeySched( (long *)theKey, aKeyarray );
  191.     Encode( aKeyarray, 8, &myPtr );
  192.  
  193.     this->arrayPush( (char *)thePassword, 8 );
  194. }
  195. #else
  196. void TAFPSession::desPush( PassWord * /* Key */, PassWord * Password, Boolean /* useNewDES */ )
  197. {
  198.     this->arrayPush( (char *)Password, 8 );
  199. }
  200. #endif    
  201.  
  202. void TAFPSession::fileDirPush( short Bitmap, FileDirBlock& theBlock )
  203. {
  204.     short * longNamePtr;
  205.     short * shortNamePtr;
  206.     char * startPtr;
  207.     
  208.     startPtr = fCBptr;
  209.     if (Bitmap & 0x01)
  210.         this->shortPush( theBlock.Attributes );
  211.     if (Bitmap & 0x02)
  212.         this->longPush( theBlock.ParentDirID );
  213.     if (Bitmap & 0x04)
  214.         this->longPush( theBlock.CreateDate );
  215.     if (Bitmap & 0x08)
  216.         this->longPush( theBlock.ModDate );
  217.     if (Bitmap & 0x10)
  218.         this->longPush( theBlock.BackupDate );
  219.     if (Bitmap & 0x20)
  220.         this->arrayPush( (char *)theBlock.FinderInfo, 32 );
  221.     if (Bitmap & 0x40) {
  222.         longNamePtr = (short *)fCBptr;
  223.         this->shortPush( theBlock.LongName );
  224.     }
  225.     if (Bitmap & 0x80) {
  226.         shortNamePtr = (short *)fCBptr;
  227.         this->shortPush( theBlock.ShortName );
  228.     }
  229.     if (theBlock.FileDirFlag == 0)
  230.     {
  231.         if (Bitmap & 0x100)
  232.             this->longPush( theBlock.File.FileNumber );
  233.         if (Bitmap & 0x200)
  234.             this->longPush( theBlock.File.DataLength );
  235.         if (Bitmap & 0x400)
  236.             this->longPush( theBlock.File.RsrcLength );
  237.     }
  238.     else
  239.     {
  240.         if (Bitmap & 0x100)
  241.             this->longPush( theBlock.Dir.DirID );
  242.         if (Bitmap & 0x200)
  243.             this->shortPush( theBlock.Dir.OffspringCount );
  244.         if (Bitmap & 0x400)
  245.             this->longPush( theBlock.Dir.OwnerID );
  246.         if (Bitmap & 0x800)
  247.             this->longPush( theBlock.Dir.GroupID );
  248.         if (Bitmap & 0x1000)
  249.             this->longPush( theBlock.Dir.AccessRights );
  250.     }
  251.     if (Bitmap & 0x2000)
  252.     {
  253.         this->shortPush( theBlock.ProDOSFileType );
  254.         this->longPush( theBlock.ProDOSAuxType );
  255.     }
  256.     if (Bitmap & 0x40)
  257.         *longNamePtr = fCBptr - startPtr;
  258.     if (Bitmap & 0x80)
  259.         *shortNamePtr = fCBptr - startPtr;    // I'm assuming that short and long names are never set simultaneously
  260. }
  261.  
  262. void TAFPSession::specPush( short Bitmap, FileDirBlock& theBlock, char * string )
  263. {
  264.     Spec * theSpec;
  265.     
  266.     theSpec = (Spec *)fCBptr;
  267.     fCBptr += 2;
  268. //    if (*string == '\0') {
  269. //        Bitmap &= 0xFF3F;    // Clear shortname and longname bits
  270. //    }
  271.     this->fileDirPush( Bitmap, theBlock );
  272.     if (*string != '\0') {
  273.         this->stringPush( string );
  274.     }
  275.     theSpec->length = fCBptr - (Ptr)theSpec - 2;
  276.     theSpec->filler = 0;
  277. }
  278.  
  279. void TAFPSession::alignPush()
  280. {
  281.     long digit;
  282.     
  283.     if ((digit = (unsigned long)fCBptr) & 1L) {        // is fCBptr odd?
  284.         *fCBptr = '\0';                                // then move it to a word boundary
  285.         fCBptr++;
  286.     }
  287.     fCBSize = fCBptr - fCBStart;
  288. }
  289.  
  290. Ptr TAFPSession::GetReply()
  291. {
  292.     return fRBStart;
  293. }
  294.  
  295. short TAFPSession::SetVolumeID( short VolumeID )
  296. {
  297.     short oldVolumeID;
  298.     
  299.     oldVolumeID = fVolumeID;
  300.     fVolumeID = VolumeID;
  301.     return oldVolumeID;
  302. }
  303.  
  304. short TAFPSession::GetVolumeID()
  305. {
  306.     return fVolumeID;
  307. }
  308.  
  309. long TAFPSession::SetDirID( long DirID )
  310. {
  311.     long oldDirID;
  312.     
  313.     oldDirID = fDirID;
  314.     fDirID = DirID;
  315.     return oldDirID;
  316. }
  317.  
  318. long TAFPSession::GetDirID()
  319. {
  320.     return fDirID;
  321. }
  322.  
  323. short TAFPSession::SetForkID( short OForkRefNum )
  324. {
  325.     short oldOForkRefNum;
  326.     
  327.     oldOForkRefNum = fOForkRefNum;
  328.     fOForkRefNum = OForkRefNum;
  329.     return oldOForkRefNum;
  330. }
  331.  
  332. short TAFPSession::GetForkID()
  333. {
  334.     return fOForkRefNum;
  335. }
  336.  
  337. short TAFPSession::GetIDNum()
  338. {
  339.     return 0;
  340. }
  341.  
  342. short TAFPSession::SetDTRefNum( short DTRefNum )
  343. {
  344.     short oldDTRefNum;
  345.     
  346.     oldDTRefNum = fDTRefNum;
  347.     fDTRefNum = DTRefNum;
  348.     return oldDTRefNum;
  349. }
  350.  
  351. short TAFPSession::GetDTRefNum()
  352. {
  353.     return fDTRefNum;
  354. }
  355.  
  356. short TAFPSession::SetUserID( short /* UserID */ )
  357. {
  358.     return 0;
  359. }
  360.  
  361. short TAFPSession::GetUserID()
  362. {
  363.     return 0;
  364. }
  365.  
  366. long TAFPSession::SetMapID( long MapID )
  367. {
  368.     long oldMapID;
  369.     
  370.     oldMapID = fMapID;
  371.     fMapID = MapID;
  372.     return oldMapID;
  373. }
  374.  
  375. long TAFPSession::GetMapID()
  376. {
  377.     return fMapID;
  378. }
  379.  
  380. long TAFPSession::SetFileID( long FileID )
  381. {
  382.     long oldFileID;
  383.     
  384.     oldFileID = fFileID;
  385.     fFileID = FileID;
  386.     return oldFileID;
  387. }
  388.  
  389. long TAFPSession::GetFileID()
  390. {
  391.     return fFileID;
  392. }
  393.  
  394. long TAFPSession::GetActCount()
  395. {
  396.     return fActCount;
  397. }
  398.  
  399. long TAFPSession::GetOffset()
  400. {
  401.     return fOffset;
  402. }
  403.  
  404. void TAFPSession::SetAFPVersion( char * version )
  405. {
  406.     strcpy( fAFPVersion, version );
  407. }
  408.  
  409. char * TAFPSession::GetAFPVersion()
  410. {
  411.     return fAFPVersion;
  412. }
  413.  
  414. void TAFPSession::SetPathDelimiter( char delimiter )
  415. {
  416.     fPathDelimiter = delimiter;
  417. }
  418.  
  419. char TAFPSession::GetPathDelimiter()
  420. {
  421.     return fPathDelimiter;
  422. }
  423.  
  424. OSErr TAFPSession::GetSrvrInfo()
  425. {
  426.     this->Debug(0, "GetSrvrInfo");
  427.     fRBSize        = kMaxBufSize;
  428.     
  429.     return DoGetStatus( fRBStart, fRBSize, fafpAddrBlock );
  430. }
  431.  
  432.  
  433. OSErr TAFPSession::GetSrvrParms()
  434. {
  435.     struct commandBuffer {
  436.         Byte command;
  437.     } *cbPtr;
  438.     
  439.     this->Debug(0, "GetSrvrParms");
  440.  
  441.     fCBSize = sizeof( commandBuffer );
  442.     fRBSize = kMaxBufSize;                    
  443.     cbPtr = (commandBuffer *)fCBStart;
  444.     
  445.     cbPtr->command = afpGetSParms;
  446.     
  447.     return this->MakeAFPCall();
  448. }
  449.  
  450. OSErr TAFPSession::GetSrvrMsg( short MsgType, short MsgBitmap )
  451. {
  452.     struct commandBuffer {
  453.         Byte command;
  454.         Byte filler;
  455.         short MsgType;
  456.         short MsgBitmap;
  457.     } *cbPtr;
  458.     
  459.     this->Debug(0, "GetSrvrMsg");
  460.  
  461.     fCBSize = sizeof( commandBuffer );
  462.     fRBSize = kMaxBufSize;                    
  463.     cbPtr = (commandBuffer *)fCBStart;
  464.     
  465.     cbPtr->command = afpGetSrvrMsg;
  466.     cbPtr->MsgType = MsgType;
  467.     cbPtr->MsgBitmap = MsgBitmap;
  468.     
  469.     return this->MakeAFPCall();
  470. }
  471.  
  472. OSErr TAFPSession::LoginGuest()
  473. {
  474.     this->Debug(0, "LoginGuest");
  475.     
  476.     return this->Login( fAFPVersion, "No User Authent", 0, 0 );
  477. }
  478.  
  479. OSErr TAFPSession::LoginCleartxt( char * UserName, char * Password )
  480. {
  481.     this->Debug(0, "LoginCleartxt");
  482.     
  483.     return this->Login( fAFPVersion, "Cleartxt Passwrd", UserName, Password );
  484. }
  485.  
  486. OSErr TAFPSession::LoginRandnum( char * UserName, char * Password )
  487. {
  488.     short IDNumber;
  489.     char UserAuthInfo[8];
  490.     
  491.     struct replyBuffer {
  492.         short IDNumber;
  493.         char UserAuthInfo[8];
  494.     } * rbPtr;
  495.  
  496.     this->Debug(0, "LoginRandnum");
  497.     
  498.     this->Login( fAFPVersion, "Randnum Exchange", UserName, 0 );
  499.     if ( fErrResult != afpAuthContinue )
  500.         return fErrResult;
  501.     
  502.     rbPtr = (replyBuffer *)fRBStart;
  503.     
  504.     IDNumber = rbPtr->IDNumber;
  505.  
  506.     memcpy( UserAuthInfo, rbPtr->UserAuthInfo, 8 ); 
  507.  
  508.     return this->LoginCont( IDNumber, UserAuthInfo, Password );
  509. }
  510.  
  511. OSErr TAFPSession::Login2Way( char * UserName, char * Password )
  512. {
  513.     short IDNumber;
  514.     char SrvrAuthInfo[8];
  515.     
  516.     struct replyBuffer {
  517.         short IDNumber;
  518.         char SrvrAuthInfo[8];
  519.     } * rbPtr;
  520.  
  521.     this->Debug(0, "Login2Way");
  522.     
  523.     this->Login( fAFPVersion, "2-Way Randnum exchange", UserName, 0 );
  524.     if ( fErrResult != afpAuthContinue )
  525.         return fErrResult;
  526.     
  527.     rbPtr = (replyBuffer *)fRBStart;
  528.     
  529.     IDNumber = rbPtr->IDNumber;
  530.  
  531.     memcpy( SrvrAuthInfo, rbPtr->SrvrAuthInfo, 8 ); 
  532.  
  533.     return this->LoginCont2Way( IDNumber, SrvrAuthInfo, Password, "EncodeMe" );
  534. }
  535.     
  536. OSErr TAFPSession::LoginCont2Way(  short IDNumber,
  537.                                    char * UserAuthInfo,
  538.                                    char * Password,
  539.                                    char * UserRandNum )
  540. {
  541.     struct commandBuffer {
  542.         Byte command;
  543.         Byte filler;
  544.         short IDNumber;
  545.         char marker;
  546.     } *cbPtr;
  547.     
  548.     PassWord passW;
  549.     PassWord * passWPtr;
  550.     passWPtr = (PassWord *)&passW[0];
  551.     
  552.     this->Debug(0, "LoginCont2Way");
  553.         
  554.     fCBSize = sizeof( commandBuffer );
  555.     fRBSize = 10;                    
  556.     cbPtr = (commandBuffer *)fCBStart;
  557.     
  558.     cbPtr->command = afpContLogin;
  559.     cbPtr->filler = '\0';
  560.     cbPtr->IDNumber = IDNumber;
  561.  
  562.     fCBptr = &(cbPtr->marker);
  563.     
  564.     this->passwordCreate( passWPtr, Password );
  565.     this->desPush( passWPtr, (PassWord *)UserAuthInfo, true );
  566.     this->passwordCreate( passWPtr, UserRandNum );
  567.     this->arrayPush( (char *)passWPtr, 8 );
  568.     
  569.     return this->MakeAFPCall();
  570. }
  571.  
  572. OSErr TAFPSession::Login( char * AFPVersion,
  573.                          char * UAM,
  574.                          char * UserName,
  575.                          char * Password )
  576. {
  577.     struct commandBuffer {
  578.         Byte command;
  579.         char marker;
  580.     } *cbPtr;
  581.     
  582.     this->Debug(0, "Login");
  583.         
  584.     fCBSize = sizeof( commandBuffer );
  585.     fRBSize = 10;                    
  586.     cbPtr = (commandBuffer *)fCBStart;
  587.         
  588.     cbPtr->command = afpLogin;
  589.     
  590.     fCBptr = &(cbPtr->marker);
  591.     stringPush( AFPVersion );
  592.     stringPush( UAM );
  593.     
  594.     stringPush( UserName );
  595.     if (Password != NULL)
  596.     {
  597.         alignPush();
  598.         passwordPush( Password );
  599.     }
  600.     
  601.     return this->DoLogin( fCBStart, fCBSize, fRBStart, fRBSize, fafpAddrBlock );
  602. }
  603.  
  604.  
  605. OSErr TAFPSession::LoginCont( short IDNumber,
  606.                              char * UserAuthInfo,
  607.                              char * Password )
  608. {
  609.     struct commandBuffer {
  610.         Byte command;
  611.         Byte filler;
  612.         short IDnumber;
  613.         char marker;
  614.     } *cbPtr;
  615.     
  616.     PassWord passX;
  617.     PassWord * passXPtr;
  618.     passXPtr = (PassWord *)&passX[0];
  619.     
  620.     this->Debug(0, "LoginCont");
  621.         
  622.     fCBSize = sizeof( commandBuffer );
  623.     fRBSize = 10;                    
  624.     cbPtr = (commandBuffer *)fCBStart;
  625.     
  626.     cbPtr->command = afpContLogin;
  627.     cbPtr->filler = '\0';
  628.     cbPtr->IDnumber = IDNumber;
  629.  
  630.     fCBptr = &(cbPtr->marker);
  631.     
  632.     this->passwordCreate( passXPtr, Password );
  633.     this->desPush( passXPtr, (PassWord *)UserAuthInfo, false );
  634.     
  635.     return this->MakeAFPCall();
  636. }
  637.  
  638.  
  639. OSErr TAFPSession::Logout()
  640. {
  641.     this->Debug(0, "Logout");
  642.     
  643.     return this->DoLogout();
  644. }
  645.  
  646. OSErr TAFPSession::MapID( long UserID, char FnType )
  647. {
  648.     struct commandBuffer {
  649.         Byte command;
  650.         Byte subfunction;
  651.         long ID;
  652.     } *cbPtr;
  653.  
  654.     this->Debug(0, "MapID");
  655.     
  656.     fCBSize = sizeof( commandBuffer );
  657.     fRBSize = kMaxBufSize;
  658.     cbPtr = (commandBuffer *)fCBStart;
  659.     
  660.     cbPtr->command = afpMapID;
  661.     cbPtr->subfunction = FnType;
  662.     cbPtr->ID = UserID;
  663.  
  664.     return( this->MakeAFPCall() );
  665. }
  666.  
  667. OSErr TAFPSession::MapName( char * UserName, char FnType )
  668. {
  669.     struct commandBuffer {
  670.         Byte command;
  671.         Byte subfunction;
  672.         char marker;
  673.     } *cbPtr;
  674.     
  675.     this->Debug(0, "MapName");
  676.     
  677.     fCBSize = sizeof( commandBuffer );
  678.     fRBSize = kMaxBufSize;
  679.     cbPtr = (commandBuffer *)fCBStart;
  680.     
  681.     cbPtr->command = afpMapName;
  682.     cbPtr->subfunction = FnType;
  683.     
  684.     fCBptr = &(cbPtr->marker);
  685.     this->stringPush( UserName );
  686.  
  687.     this->MakeAFPCall();
  688.     
  689.     fMapID = *(long *)fRBStart;
  690.     
  691.     return fErrResult;
  692. }
  693.  
  694. OSErr TAFPSession::ChangePassword( char * UAM,
  695.                                   char * UserName,
  696.                                   char * OldPassword,
  697.                                   char * NewPassword )
  698. {
  699.     PassWord passX;
  700.     PassWord passY;
  701.     PassWord * passXPtr;
  702.     passXPtr = (PassWord *)&passX[0];
  703.     PassWord * passYPtr;
  704.     passYPtr = (PassWord *)&passY[0];
  705.     
  706.     this->Debug(0, "ChangePassword");
  707.     
  708.     fRBSize = kMaxBufSize;
  709.     
  710.     fCBptr = fCBStart;
  711.     this->bytePush( afpChangePwd );
  712.     this->alignPush();
  713.     this->stringPush( UAM );
  714.     this->alignPush();
  715.     this->stringPush( UserName );
  716.     this->alignPush();
  717.     if ( strcmp( UAM, "Randnum Exchange") == 0 )
  718.     {
  719.         this->passwordCreate( passXPtr, NewPassword );
  720.         this->passwordCreate( passYPtr, OldPassword );
  721.         this->desPush( passXPtr, passYPtr, false );
  722.         this->desPush( passYPtr, passXPtr, false );
  723.     }
  724.     else
  725.     {
  726.         this->passwordPush( OldPassword );
  727.         this->passwordPush( NewPassword );
  728.     }
  729.     return this->MakeAFPCall();
  730. }
  731.  
  732. OSErr TAFPSession::GetUserInfo(
  733.                   Byte ThisUserFlag,
  734.                   short Bitmap,
  735.                   long UserID )
  736. {
  737.     struct commandBuffer {
  738.         Byte command;
  739.         Byte ThisUserFlag;
  740.         long UserID;
  741.         short Bitmap;
  742.     } *cbPtr;
  743.  
  744.     this->Debug(0, "GetUserInfo");
  745.     
  746.     fCBSize = sizeof( commandBuffer );
  747.     fRBSize = 10;
  748.     cbPtr = (commandBuffer *)fCBStart;
  749.     
  750.     cbPtr->command = afpGetUserInfo;
  751.     cbPtr->ThisUserFlag = ThisUserFlag;
  752.     cbPtr->UserID = UserID;
  753.     cbPtr->Bitmap = Bitmap;
  754.                         
  755.     return this->MakeAFPCall();
  756. }
  757.  
  758.  
  759. /* Volume Calls     ----------------------------------------------------------------- */
  760.  
  761. OSErr TAFPSession::OpenVol( char * VolumeName, char * Password, short Bitmap )
  762. {
  763.     struct commandBuffer {
  764.         Byte command;
  765.         Byte filler;
  766.         short Bitmap;
  767.         char marker;
  768.     } *cbPtr;
  769.     
  770.     struct replyBuffer {
  771.         short Bitmap;
  772.         short VolumeID;
  773.     } *rbPtr;
  774.     
  775.     this->Debug(0, "OpenVol");
  776.  
  777.     if (Bitmap != 0x20)
  778.         this->OpenVol( VolumeName, Password, 0x20 );
  779.  
  780.      fCBSize = sizeof( commandBuffer );
  781.     fRBSize = kMaxBufSize;                    
  782.     cbPtr = (commandBuffer *)fCBStart;
  783.     
  784.     cbPtr->command = afpOpenVol;
  785.     cbPtr->filler = '\0';
  786.     cbPtr->Bitmap = Bitmap;
  787.     
  788.     fCBptr = &(cbPtr->marker);
  789.     this->stringPush( VolumeName );
  790.     if (Password)
  791.     {
  792.         this->alignPush();
  793.         this->arrayPush( Password, 8 );
  794.     }
  795.  
  796.     this->MakeAFPCall();
  797.     
  798.     rbPtr = (replyBuffer *)fRBStart;
  799.     if ( rbPtr->Bitmap == 0x20 )
  800.     {
  801.         fVolumeID = rbPtr->VolumeID;
  802.     }
  803.     
  804.     return fErrResult;
  805. }
  806.  
  807. OSErr TAFPSession::SetVolParms( short VolumeID, short Bitmap, long BackupDate )
  808. {
  809.     struct commandBuffer {
  810.         Byte command;
  811.         Byte filler;
  812.         short VolumeID;
  813.         short Bitmap;
  814.         long BackupDate;
  815.     } *cbPtr;
  816.     
  817.     this->Debug(0, "SetVolParms");
  818.  
  819.     fCBSize = sizeof( commandBuffer );
  820.     fRBSize = kMinBufSize;                    
  821.     cbPtr = (commandBuffer *)fCBStart;
  822.     
  823.     cbPtr->command = afpSetVolParms;
  824.     cbPtr->filler = '\0';
  825.     cbPtr->VolumeID = VolumeID;
  826.     cbPtr->Bitmap = Bitmap;
  827.     cbPtr->BackupDate = BackupDate;
  828.     
  829.     return this->MakeAFPCall();
  830. }
  831.  
  832. OSErr TAFPSession::GetVolParms( short VolumeID, short Bitmap )
  833. {
  834.     struct commandBuffer {
  835.         Byte command;
  836.         Byte filler;
  837.         short VolumeID;
  838.         short Bitmap;
  839.     } *cbPtr;
  840.     
  841.     this->Debug(0, "GetVolParms");
  842.  
  843.     fCBSize = sizeof( commandBuffer );
  844.     fRBSize = kMaxBufSize;                    
  845.     cbPtr = (commandBuffer *)fCBStart;
  846.     
  847.     cbPtr->command = afpGetVolParms;
  848.     cbPtr->filler = '\0';
  849.     cbPtr->VolumeID = VolumeID;
  850.     cbPtr->Bitmap = Bitmap; 
  851.     
  852.     return this->MakeAFPCall();
  853. }
  854.  
  855. OSErr TAFPSession::Flush( short VolumeID )
  856. {
  857.     struct commandBuffer {
  858.         Byte command;
  859.         Byte filler;
  860.         short VolumeID;
  861.     } *cbPtr;
  862.     
  863.     this->Debug(0, "Flush");
  864.     
  865.     fCBSize = sizeof( commandBuffer );
  866.     fRBSize = kMinBufSize;
  867.     cbPtr = (commandBuffer *)fCBStart;
  868.     
  869.     cbPtr->command = afpFlush;
  870.     cbPtr->filler = '\0';
  871.     cbPtr->VolumeID = VolumeID;
  872.     
  873.     return this->MakeAFPCall();
  874. }
  875.  
  876. OSErr TAFPSession::CloseVol( short VolumeID )
  877. {
  878.     struct commandBuffer {
  879.         Byte command;
  880.         Byte filler;
  881.         short VolumeID;
  882.     } *cbPtr;
  883.  
  884.     this->Debug(0, "CloseVol");
  885.     
  886.     fCBSize = sizeof( commandBuffer );
  887.     fRBSize = kMinBufSize;
  888.     cbPtr = (commandBuffer *)fCBStart;
  889.     
  890.     cbPtr->command = afpVolClose;
  891.     cbPtr->filler = '\0';
  892.     cbPtr->VolumeID = VolumeID;
  893.     
  894.     return this->MakeAFPCall();
  895. }
  896.  
  897.  
  898.  
  899. /* Directory Calls ----------------------------------------------------------- */
  900.  
  901. OSErr TAFPSession::SetDirParms( short VolumeID,
  902.                                long DirID,
  903.                                short Bitmap,
  904.                                Byte PathType,
  905.                                char * Pathname,
  906.                                FileDirBlock& theBlock )
  907. {
  908.     struct commandBuffer {
  909.         Byte command;
  910.         Byte filler;
  911.         short VolumeID;
  912.         long DirID;
  913.         short Bitmap;
  914.         char marker;
  915.     } *cbPtr;
  916.     
  917.     this->Debug(0, "SetDirParms");
  918.     
  919.     fCBSize = sizeof( commandBuffer );
  920.     fRBSize = kMaxBufSize;
  921.     cbPtr = (commandBuffer *)fCBStart;
  922.     
  923.     cbPtr->command = afpSetDirParms;
  924.     cbPtr->filler = '\0';
  925.     cbPtr->VolumeID = VolumeID;
  926.     cbPtr->DirID = DirID;
  927.     cbPtr->Bitmap = Bitmap;
  928.     
  929.     fCBptr = &(cbPtr->marker);
  930.     this->pathPush( PathType, Pathname );
  931.     this->alignPush();
  932.     theBlock.FileDirFlag = 0x8000;
  933.     this->fileDirPush( Bitmap, theBlock );
  934.     
  935.     return this->MakeAFPCall();
  936. }
  937.  
  938. OSErr TAFPSession::OpenDir( short VolumeID,
  939.                            long DirID,
  940.                            Byte PathType,
  941.                            char * Pathname )
  942. {
  943.     struct commandBuffer {
  944.         Byte command;
  945.         Byte filler;
  946.         short VolumeID;
  947.         long DirID;
  948.         char marker;
  949.     } *cbPtr;
  950.     
  951.     this->Debug(0, "OpenDir");
  952.  
  953.     fCBSize = sizeof( commandBuffer );
  954.     fRBSize = kMaxBufSize;
  955.     cbPtr = (commandBuffer *)fCBStart;
  956.     
  957.     cbPtr->command = afpOpenDir;
  958.     cbPtr->filler = '\0';
  959.     cbPtr->VolumeID = VolumeID;
  960.     cbPtr->DirID = DirID;
  961.     
  962.     fCBptr = &(cbPtr->marker);
  963.     this->pathPush( PathType, Pathname );
  964.     
  965.     this->MakeAFPCall();
  966.     
  967.     fDirID = *(long *)fRBStart;
  968.     
  969.     return fErrResult;
  970. }
  971.  
  972. OSErr TAFPSession::CloseDir( short VolumeID, long DirID )
  973. {
  974.     struct commandBuffer {
  975.         Byte command;
  976.         Byte filler;
  977.         short VolumeID;
  978.         long DirID;
  979.     } *cbPtr;
  980.     
  981.     this->Debug(0, "CloseDir");
  982.  
  983.     fCBSize = sizeof( commandBuffer );
  984.     fRBSize = kMaxBufSize;
  985.     cbPtr = (commandBuffer *)fCBStart;
  986.     
  987.     cbPtr->command = afpDirClose;
  988.     cbPtr->filler = '\0';
  989.     cbPtr->VolumeID = VolumeID;
  990.     cbPtr->DirID = DirID;
  991.  
  992.     return this->MakeAFPCall();
  993. }
  994.  
  995. OSErr TAFPSession::Enumerate( short VolumeID,
  996.                              long DirID,
  997.                              short FileBitmap,
  998.                              short DirBitmap,
  999.                              short ReqCount,
  1000.                              short StartIndex,
  1001.                              short MaxReplySize,
  1002.                              Byte PathType,
  1003.                              char * Pathname )
  1004. {
  1005.     struct commandBuffer {
  1006.         Byte command;
  1007.         Byte filler;
  1008.         short VolumeID;
  1009.         long DirID;
  1010.         short FileBitmap;
  1011.         short DirBitmap;
  1012.         short ReqCount;
  1013.         short StartIndex;
  1014.         short MaxReplySize;
  1015.         char marker;
  1016.     } *cbPtr;
  1017.         
  1018.     this->Debug(0, "Enumerate");
  1019.  
  1020.     fCBSize = sizeof( commandBuffer );
  1021.     fRBSize = MaxReplySize;
  1022.     cbPtr = (commandBuffer *)fCBStart;
  1023.     
  1024.     cbPtr->command = afpEnumerate;
  1025.     cbPtr->filler = '\0';
  1026.     cbPtr->VolumeID = VolumeID;
  1027.     cbPtr->DirID = DirID;
  1028.     cbPtr->FileBitmap = FileBitmap;
  1029.     cbPtr->DirBitmap = DirBitmap;
  1030.     cbPtr->ReqCount = ReqCount;
  1031.     cbPtr->StartIndex = StartIndex;
  1032.     cbPtr->MaxReplySize = MaxReplySize;
  1033.     
  1034.     fCBptr = &(cbPtr->marker);
  1035.     this->pathPush( PathType, Pathname );
  1036.  
  1037.     return this->MakeAFPCall();
  1038. }
  1039.  
  1040.  
  1041. OSErr TAFPSession::CreateDir( short VolumeID,
  1042.                               long DirID,
  1043.                               Byte PathType,
  1044.                               char * Pathname )
  1045. {
  1046.     struct commandBuffer {
  1047.         Byte command;
  1048.         Byte filler;
  1049.         short VolumeID;
  1050.         long DirID;
  1051.         char marker;
  1052.     } *cbPtr;
  1053.     
  1054.     this->Debug(0, "CreateDir");
  1055.  
  1056.     fCBSize = sizeof( commandBuffer );
  1057.     fRBSize = kMaxBufSize;
  1058.     cbPtr = (commandBuffer *)fCBStart;
  1059.     
  1060.     cbPtr->command = afpDirCreate;
  1061.     cbPtr->filler = '\0';
  1062.     cbPtr->VolumeID = VolumeID;
  1063.     cbPtr->DirID = DirID;
  1064.     
  1065.     fCBptr = &(cbPtr->marker);
  1066.     this->pathPush( PathType, Pathname );
  1067.     
  1068.     this->MakeAFPCall();
  1069.     
  1070.     fDirID = *(long *)fRBStart;
  1071.     
  1072.     return fErrResult;
  1073. }
  1074.  
  1075.  
  1076.  
  1077.  
  1078. /* File Calls ----------------------------------------------------------- */
  1079.  
  1080. OSErr TAFPSession::SetFileParms( short VolumeID,
  1081.                                 long DirID,
  1082.                                 short Bitmap,
  1083.                                 Byte PathType,
  1084.                                 char * Pathname,
  1085.                                 FileDirBlock& theBlock )
  1086. {
  1087.     struct commandBuffer {
  1088.         Byte command;
  1089.         Byte filler;
  1090.         short VolumeID;
  1091.         long DirID;
  1092.         short Bitmap;
  1093.         char marker;
  1094.     } *cbPtr;
  1095.     
  1096.     this->Debug(0, "SetFileParms");
  1097.     
  1098.     fCBSize = sizeof( commandBuffer );
  1099.     fRBSize = kMaxBufSize;
  1100.     cbPtr = (commandBuffer *)fCBStart;
  1101.     
  1102.     cbPtr->command = afpSetFileParms;
  1103.     cbPtr->filler = '\0';
  1104.     cbPtr->VolumeID = VolumeID;
  1105.     cbPtr->DirID = DirID;
  1106.     cbPtr->Bitmap = Bitmap;
  1107.  
  1108.     fCBptr = &(cbPtr->marker);
  1109.     this->pathPush( PathType, Pathname );
  1110.     this->alignPush();
  1111.     theBlock.FileDirFlag = 0;
  1112.     this->fileDirPush( Bitmap, theBlock );
  1113.  
  1114.     return this->MakeAFPCall();
  1115. }
  1116.  
  1117. OSErr TAFPSession::CreateFile( short VolumeID,
  1118.                               long DirID, 
  1119.                               Byte CreateFlag,
  1120.                               Byte PathType,
  1121.                               char * Pathname )
  1122.     struct commandBuffer {
  1123.         Byte command;
  1124.         Byte CreateFlag;
  1125.         short VolumeID;
  1126.         long DirID;
  1127.         char marker;
  1128.     } *cbPtr;
  1129.  
  1130.     this->Debug(0, "CreateFile");
  1131.     
  1132.     fCBSize = sizeof( commandBuffer );
  1133.     fRBSize = kMaxBufSize;
  1134.     cbPtr = (commandBuffer *)fCBStart;
  1135.     
  1136.     cbPtr->command = afpFileCreate;
  1137.     cbPtr->CreateFlag = CreateFlag;
  1138.     cbPtr->VolumeID = VolumeID;
  1139.     cbPtr->DirID = DirID;
  1140.  
  1141.     fCBptr = &(cbPtr->marker);
  1142.     
  1143.     this->pathPush( PathType, Pathname );
  1144.  
  1145.      return this->MakeAFPCall();
  1146. }
  1147.  
  1148. OSErr TAFPSession::CopyFile( short SVolumeID,
  1149.                             long SDirID,
  1150.                             Byte SPathType,
  1151.                             char * SPathname,
  1152.                             short DVolumeID,
  1153.                             long DDirID,
  1154.                             Byte DPathType,
  1155.                             char * DPathname,
  1156.                             Byte NewType,
  1157.                             char * NewName )
  1158. {
  1159.     struct commandBuffer {
  1160.         Byte command;
  1161.         Byte filler;
  1162.         short SrcVolumeID;
  1163.         long SrcDirID;
  1164.         short DestVolumeID;
  1165.         long DestDirID;
  1166.         char marker;
  1167.     } *cbPtr;
  1168.     
  1169.     this->Debug(0, "CopyFile");
  1170.     
  1171.     fCBSize = sizeof( commandBuffer );
  1172.     fRBSize = kMaxBufSize;
  1173.     cbPtr = (commandBuffer *)fCBStart;
  1174.     
  1175.     cbPtr->command = afpCopyFile;
  1176.     cbPtr->filler = '\0';
  1177.     cbPtr->SrcVolumeID = SVolumeID;
  1178.     cbPtr->SrcDirID = SDirID;
  1179.     cbPtr->DestVolumeID = DVolumeID;
  1180.     cbPtr->DestDirID = DDirID;
  1181.     
  1182.     fCBptr = &(cbPtr->marker);
  1183.     
  1184.     this->pathPush( SPathType, SPathname );
  1185.     this->pathPush( DPathType, DPathname );
  1186.     this->pathPush( NewType, NewName );
  1187.  
  1188.      return this->MakeAFPCall();
  1189. }
  1190.  
  1191. OSErr TAFPSession::CreateID( short VolumeID,
  1192.                             long DirID,
  1193.                             Byte PathType,
  1194.                             char * Pathname )
  1195. {
  1196.     struct commandBuffer {
  1197.         Byte command;
  1198.         Byte filler;
  1199.         short VolumeID;
  1200.         long DirID;
  1201.         char marker;
  1202.     } *cbPtr;
  1203.     
  1204.     this->Debug(0, "CreateID");
  1205.     
  1206.     fCBSize = sizeof( commandBuffer );
  1207.     fRBSize = kMaxBufSize;
  1208.     cbPtr = (commandBuffer *)fCBStart;
  1209.     
  1210.     cbPtr->command = afpCreateID;
  1211.     cbPtr->filler = '\0';
  1212.     cbPtr->VolumeID = VolumeID;
  1213.     cbPtr->DirID = DirID;
  1214.  
  1215.     fCBptr = &(cbPtr->marker);
  1216.     this->pathPush( PathType, Pathname );
  1217.  
  1218.     this->MakeAFPCall();
  1219.     
  1220.     if (!fErrResult)
  1221.     {
  1222.         fFileID = *(long *)fRBStart;
  1223.     }
  1224.         
  1225.     return fErrResult;
  1226. }
  1227.  
  1228. OSErr TAFPSession::DeleteID( short VolumeID,
  1229.                             long FileID )
  1230. {
  1231.     struct commandBuffer {
  1232.         Byte command;
  1233.         Byte filler;
  1234.         short VolumeID;
  1235.         long FileID;
  1236.     } *cbPtr;
  1237.  
  1238.     this->Debug(0, "DeleteID");
  1239.     
  1240.     fCBSize = sizeof( commandBuffer );
  1241.     fRBSize = kMaxBufSize;
  1242.     cbPtr = (commandBuffer *)fCBStart;
  1243.     
  1244.     cbPtr->command = afpDeleteID;
  1245.     cbPtr->filler = '\0';
  1246.     cbPtr->VolumeID = VolumeID;
  1247.     cbPtr->FileID = FileID;
  1248.         
  1249.     return this->MakeAFPCall();
  1250. }
  1251.  
  1252. OSErr TAFPSession::ResolveID( short VolumeID,
  1253.                                 long FileID,
  1254.                              short Bitmap )
  1255. {
  1256.     struct commandBuffer {
  1257.         Byte command;
  1258.         Byte filler;
  1259.         short VolumeID;
  1260.         long FileID;
  1261.         short Bitmap;
  1262.     } *cbPtr;
  1263.     
  1264.     this->Debug(0, "ResolveID");
  1265.     
  1266.     fCBSize = sizeof( commandBuffer );
  1267.     fRBSize = kMaxBufSize;
  1268.     cbPtr = (commandBuffer *)fCBStart;
  1269.     
  1270.     cbPtr->command = afpResolveID;
  1271.     cbPtr->filler = '\0';
  1272.     cbPtr->VolumeID = VolumeID;
  1273.     cbPtr->FileID = FileID;
  1274.     cbPtr->Bitmap = Bitmap;
  1275.     
  1276.     return this->MakeAFPCall();
  1277. }
  1278.  
  1279.  
  1280. OSErr TAFPSession::ExchangeFiles( short VolumeID,
  1281.                                     long SrcDirID,
  1282.                                     long DestDirID,
  1283.                                     Byte SrcPathType,
  1284.                                  char * SrcPathname,
  1285.                                     Byte DestPathType,
  1286.                                  char * DestPathname )
  1287. {
  1288.     struct commandBuffer {
  1289.         Byte command;
  1290.         Byte filler;
  1291.         short VolumeID;
  1292.         long SrcDirID;
  1293.         long DestDirID;
  1294.         char marker;
  1295.     } *cbPtr;
  1296.     
  1297.     this->Debug(0, "ExchangeFiles");
  1298.     
  1299.     fCBSize = sizeof( commandBuffer );
  1300.     fRBSize = kMaxBufSize;
  1301.     cbPtr = (commandBuffer *)fCBStart;
  1302.     
  1303.     cbPtr->command = afpExchangeFiles;
  1304.     cbPtr->filler = '\0';
  1305.     cbPtr->VolumeID = VolumeID;
  1306.     cbPtr->SrcDirID = SrcDirID;
  1307.     cbPtr->DestDirID = DestDirID;
  1308.  
  1309.     fCBptr = &(cbPtr->marker);
  1310.     this->pathPush( SrcPathType, SrcPathname );
  1311.     this->pathPush( DestPathType, DestPathname );
  1312.  
  1313.     return this->MakeAFPCall();
  1314. }
  1315.  
  1316.  
  1317.  
  1318.  
  1319. /* Directory-File Calls ----------------------------------------------------------- */
  1320.  
  1321. OSErr TAFPSession::CatSearch( short VolumeID,
  1322.                              long ReqMatches,
  1323.                              CatPositionRec * CatPosition,
  1324.                              short FileRsItBitmap,
  1325.                              short DirRsltBitmap,
  1326.                              short FPFlag,
  1327.                              short ReqBitmap,
  1328.                              FileDirBlock& Spec1,
  1329.                              FileDirBlock& Spec2,
  1330.                              char * longName )
  1331. {
  1332.     struct commandBuffer {
  1333.         Byte command;
  1334.         Byte filler;
  1335.         short VolumeID;
  1336.         long ReqMatches;
  1337.         long filler2;
  1338.         CatPositionRec CatPosition;
  1339.         short FileRsItBitmap;
  1340.         short DirRsltBitmap;
  1341.         short FPFlag;
  1342.         short ReqBitmap;
  1343.         char marker;
  1344.     } *cbPtr;
  1345.     CatPositionRec * CatPtr;
  1346.     int i;
  1347.  
  1348.     this->Debug(0, "CatSearch");
  1349.     
  1350.     fCBSize = sizeof( commandBuffer );
  1351.     fRBSize = kMaxBufSize;
  1352.     cbPtr = (commandBuffer *)fCBStart;
  1353.     
  1354.     cbPtr->command = afpCatSearch;
  1355.     cbPtr->filler = '\0';
  1356.     cbPtr->VolumeID = VolumeID;
  1357.     cbPtr->ReqMatches = ReqMatches;
  1358.     cbPtr->filler2 = 0;
  1359.     cbPtr->CatPosition.initialize = CatPosition->initialize;
  1360.     for (i = 0; i < 6; i++)
  1361.     {
  1362.         cbPtr->CatPosition.priv[i] = CatPosition->priv[i];
  1363.     }
  1364.     cbPtr->FileRsItBitmap = FileRsItBitmap;
  1365.     cbPtr->DirRsltBitmap = DirRsltBitmap;
  1366.     cbPtr->FPFlag = FPFlag;
  1367.     cbPtr->ReqBitmap = ReqBitmap;
  1368.     fCBptr = &(cbPtr->marker);
  1369.     this->specPush( ReqBitmap, Spec1, longName );
  1370.     this->specPush( ReqBitmap, Spec2, "" );
  1371.         
  1372.     this->MakeAFPCall();
  1373.     fActCount = *(long *)(fRBptr + 20);
  1374.     CatPtr = (CatPositionRec *)fRBptr;
  1375.     CatPosition->initialize = CatPtr->initialize;
  1376.     for (i = 0; i < 6; i++)
  1377.     {
  1378.         CatPosition->priv[i] = CatPtr->priv[i];
  1379.     }
  1380.     return fErrResult;
  1381. }
  1382.  
  1383.  
  1384. OSErr TAFPSession::GetFileDirParms( short VolumeID,
  1385.                                    long DirID,
  1386.                                    short FileBitmap,
  1387.                                    short DirBitmap,
  1388.                                    Byte PathType,
  1389.                                    char * Pathname )
  1390. {
  1391.     struct commandBuffer {
  1392.         Byte command;
  1393.         Byte filler;
  1394.         short VolumeID;
  1395.         long DirID;
  1396.         short FileBitmap;
  1397.         short DirBitmap;
  1398.         char marker;
  1399.     } *cbPtr;
  1400.     
  1401.     this->Debug(0, "GetFileDirParms");
  1402.     
  1403.     fCBSize = sizeof( commandBuffer );
  1404.     fRBSize = kMaxBufSize;
  1405.     cbPtr = (commandBuffer *)fCBStart;
  1406.     
  1407.     cbPtr->command = afpGetFlDrParms;
  1408.     cbPtr->filler = '\0';
  1409.     cbPtr->VolumeID = VolumeID;
  1410.     cbPtr->DirID = DirID;
  1411.     cbPtr->FileBitmap = FileBitmap;
  1412.     cbPtr->DirBitmap = DirBitmap;
  1413.  
  1414.     fCBptr = &(cbPtr->marker);
  1415.     this->pathPush( PathType, Pathname );
  1416.  
  1417.     return this->MakeAFPCall();
  1418. }
  1419.  
  1420. OSErr TAFPSession::SetFileDirParms( short VolumeID,
  1421.                                    long DirID,
  1422.                                    short Bitmap,
  1423.                                    Byte PathType,
  1424.                                    char * Pathname,
  1425.                                    FileDirBlock& theBlock )
  1426. {
  1427.     struct commandBuffer {
  1428.         Byte command;
  1429.         Byte filler;
  1430.         short VolumeID;
  1431.         long DirID;
  1432.         short Bitmap;
  1433.         char marker;
  1434.     } *cbPtr;
  1435.     
  1436.     this->Debug(0, "SetFileDirParms");
  1437.     
  1438.     fCBSize = sizeof( commandBuffer );
  1439.     fRBSize = kMaxBufSize;
  1440.     cbPtr = (commandBuffer *)fCBStart;
  1441.     
  1442.     cbPtr->command = afpSetFlDrParms;
  1443.     cbPtr->filler = '\0';
  1444.     cbPtr->VolumeID = VolumeID;
  1445.     cbPtr->DirID = DirID;
  1446.     cbPtr->Bitmap = Bitmap;
  1447.  
  1448.     fCBptr = &(cbPtr->marker);
  1449.     this->pathPush( PathType, Pathname );
  1450.     this->alignPush();
  1451.     this->fileDirPush( Bitmap, theBlock );
  1452.  
  1453.     return this->MakeAFPCall();
  1454. }
  1455.  
  1456. OSErr TAFPSession::Rename( short VolumeID,
  1457.                           long DirID,
  1458.                           Byte PathType,
  1459.                           char * Pathname,
  1460.                           Byte NewType,
  1461.                           char * NewName )
  1462. {
  1463.     struct commandBuffer {
  1464.         Byte command;
  1465.         Byte filler;
  1466.         short VolumeID;
  1467.         long DirID;
  1468.         char marker;
  1469.     } *cbPtr;
  1470.     
  1471.     this->Debug(0, "Rename");
  1472.     
  1473.     fCBSize = sizeof( commandBuffer );
  1474.     fRBSize = kMaxBufSize;
  1475.     cbPtr = (commandBuffer *)fCBStart;
  1476.     
  1477.     cbPtr->command = afpRename;
  1478.     cbPtr->filler = '\0';
  1479.     cbPtr->VolumeID = VolumeID;
  1480.     cbPtr->DirID = DirID;
  1481.  
  1482.     fCBptr = &(cbPtr->marker);
  1483.     this->pathPush( PathType, Pathname );
  1484.     this->pathPush( NewType, NewName );
  1485.  
  1486.     return this->MakeAFPCall();
  1487. }
  1488.  
  1489. OSErr TAFPSession::Delete( short VolumeID,
  1490.                           long DirID,
  1491.                           Byte PathType,
  1492.                           char * Pathname )
  1493. {
  1494.     struct commandBuffer {
  1495.         Byte command;
  1496.         Byte filler;
  1497.         short VolumeID;
  1498.         long DirID;
  1499.         char marker;
  1500.     } *cbPtr;
  1501.     
  1502.     this->Debug(0, "Delete");
  1503.     
  1504.     fCBSize = sizeof( commandBuffer );
  1505.     fRBSize = kMaxBufSize;
  1506.     cbPtr = (commandBuffer *)fCBStart;
  1507.     
  1508.     cbPtr->command = afpDelete;
  1509.     cbPtr->filler = '\0';
  1510.     cbPtr->VolumeID = VolumeID;
  1511.     cbPtr->DirID = DirID;
  1512.  
  1513.     fCBptr = &(cbPtr->marker);
  1514.     this->pathPush( PathType, Pathname );
  1515.     
  1516.     return this->MakeAFPCall();
  1517. }
  1518.  
  1519. OSErr TAFPSession::MoveAndRename( short VolumeID,
  1520.                                  long SrcDirID,
  1521.                                  long DestDirID,
  1522.                                  Byte SrcPathType,
  1523.                                  char * SrcPathname,
  1524.                                  Byte DestPathType,
  1525.                                  char * DestPathname,
  1526.                                  Byte NewType,
  1527.                                  char * NewName )
  1528. {
  1529.     struct commandBuffer {
  1530.         Byte command;
  1531.         Byte filler;
  1532.         short VolumeID;
  1533.         long SrcDirID;
  1534.         long DestDirID;
  1535.         char marker;
  1536.     } *cbPtr;
  1537.     
  1538.     this->Debug(0, "MoveAndRename");
  1539.     
  1540.     fCBSize = sizeof( commandBuffer );
  1541.     fRBSize = kMaxBufSize;
  1542.     cbPtr = (commandBuffer *)fCBStart;
  1543.     
  1544.     cbPtr->command = afpMove;
  1545.     cbPtr->filler = '\0';
  1546.     cbPtr->VolumeID = VolumeID;
  1547.     cbPtr->SrcDirID = SrcDirID;
  1548.     cbPtr->DestDirID = DestDirID;
  1549.  
  1550.     fCBptr = &(cbPtr->marker);
  1551.     this->pathPush( SrcPathType, SrcPathname );
  1552.     this->pathPush( DestPathType, DestPathname );
  1553.     this->pathPush( NewType, NewName );
  1554.     
  1555.     return this->MakeAFPCall();
  1556. }
  1557.  
  1558.  
  1559.  
  1560. /* Fork Calls ----------------------------------------------------------- */
  1561.  
  1562. OSErr TAFPSession::GetForkParms( short OForkRefNum, short Bitmap )
  1563. {
  1564.     struct commandBuffer {
  1565.         Byte command;
  1566.         Byte filler;
  1567.         short OForkRefNum;
  1568.         short Bitmap;
  1569.     } *cbPtr;
  1570.     
  1571.     this->Debug(0, "GetForkParms");
  1572.     
  1573.     fCBSize = sizeof( commandBuffer );
  1574.     fRBSize = kMaxBufSize;
  1575.     cbPtr = (commandBuffer *)fCBStart;
  1576.     
  1577.     cbPtr->command = afpGetForkParms;
  1578.     cbPtr->filler = '\0';
  1579.     cbPtr->OForkRefNum = OForkRefNum;
  1580.     cbPtr->Bitmap = Bitmap;
  1581.  
  1582.     return this->MakeAFPCall();
  1583. }
  1584.  
  1585. OSErr TAFPSession::SetForkParms( short OForkRefNum,
  1586.                                 short Bitmap,
  1587.                                 long ForkLength )
  1588. {
  1589.     struct commandBuffer {
  1590.         Byte command;
  1591.         Byte filler;
  1592.         short OForkRefNum;
  1593.         short Bitmap;
  1594.         long ForkLength;
  1595.     } *cbPtr;
  1596.         
  1597.     this->Debug(0, "SetForkParms");
  1598.     
  1599.     fCBSize = sizeof( commandBuffer );
  1600.     fRBSize = kMaxBufSize;
  1601.     cbPtr = (commandBuffer *)fCBStart;
  1602.     
  1603.     cbPtr->command = afpSetForkParms;
  1604.     cbPtr->filler = '\0';
  1605.     cbPtr->OForkRefNum = OForkRefNum;
  1606.     cbPtr->Bitmap = Bitmap;
  1607.     cbPtr->ForkLength = ForkLength;
  1608.  
  1609.     return this->MakeAFPCall();
  1610. }
  1611.  
  1612. OSErr TAFPSession::OpenFork(    Byte RsrcDataFlag,
  1613.                             short VolumeID,
  1614.                             long DirID,
  1615.                             short Bitmap,
  1616.                             short AccessMode,
  1617.                             Byte PathType,
  1618.                             char * Pathname )
  1619. {
  1620.     struct commandBuffer {
  1621.         Byte command;
  1622.         Byte RsrcDataFlag;
  1623.         short VolumeID;
  1624.         long DirID;
  1625.         short Bitmap;
  1626.         short AccessMode;
  1627.         char marker;
  1628.     } *cbPtr;
  1629.     
  1630.     struct replyBuffer {
  1631.         short Bitmap;
  1632.         short OForkRefNum;
  1633.     } *rbPtr;
  1634.         
  1635.     this->Debug(0, "OpenFork");
  1636.     
  1637.     fCBSize = sizeof( commandBuffer );
  1638.     fRBSize = kMaxBufSize;
  1639.     cbPtr = (commandBuffer *)fCBStart;
  1640.     
  1641.     cbPtr->command = afpOpenFork;
  1642.     cbPtr->RsrcDataFlag = RsrcDataFlag;
  1643.     cbPtr->VolumeID = VolumeID;
  1644.     cbPtr->DirID = DirID;
  1645.     cbPtr->Bitmap = Bitmap;
  1646.     cbPtr->AccessMode = AccessMode;
  1647.  
  1648.     fCBptr = &(cbPtr->marker);
  1649.     this->pathPush( PathType, Pathname );
  1650.  
  1651.     this->MakeAFPCall();
  1652.  
  1653.     rbPtr = (replyBuffer *)fRBStart;
  1654.     fOForkRefNum = rbPtr->OForkRefNum;
  1655.     
  1656.     return fErrResult;
  1657. }
  1658.  
  1659. OSErr TAFPSession::Read( short OForkRefNum,
  1660.                         long Offset,
  1661.                         long ReqCount,
  1662.                         Byte NewlineMask,
  1663.                         Byte NewlineChar,
  1664.                         char * buffer )
  1665. {
  1666.     struct commandBuffer {
  1667.         Byte command;
  1668.         Byte filler;
  1669.         short OForkRefNum;
  1670.         long Offset;
  1671.         long ReqCount;
  1672.         Byte NewlineMask;
  1673.         Byte NewlineChar;
  1674.     } *cbPtr;
  1675.         
  1676.     this->Debug(0, "Read");
  1677.     
  1678.     fCBSize = sizeof( commandBuffer );
  1679.     fRBSize = 0;
  1680.     cbPtr = (commandBuffer *)fCBStart;
  1681.     
  1682.     cbPtr->command = afpRead;
  1683.     cbPtr->filler = '\0';
  1684.     cbPtr->OForkRefNum = OForkRefNum;
  1685.     cbPtr->Offset = Offset;
  1686.     cbPtr->ReqCount = ReqCount;
  1687.     cbPtr->NewlineMask = NewlineMask;
  1688.     cbPtr->NewlineChar = NewlineChar;
  1689.  
  1690.     this->DoCommand( fCBStart, fCBSize, buffer, 0 );
  1691.     
  1692.     fActCount = cbPtr->ReqCount;
  1693.     fOffset = cbPtr->Offset;
  1694.     
  1695.     return fErrResult;
  1696. }
  1697.  
  1698. OSErr TAFPSession::Write( short OForkRefNum,
  1699.                          long Offset,
  1700.                          long ReqCount,
  1701.                          Byte StartEndFlag,
  1702.                          char * buffer )
  1703. {
  1704.     struct commandBuffer {
  1705.         Byte command;
  1706.         Byte StartEndFlag;
  1707.         short OForkRefNum;
  1708.         long Offset;
  1709.         long ReqCount;
  1710.     } *cbPtr;
  1711.         
  1712.     this->Debug(0, "Write");
  1713.     
  1714.     fCBSize = sizeof( commandBuffer );
  1715.     fRBSize = 4;
  1716.     cbPtr = (commandBuffer *)fCBStart;
  1717.     
  1718.     cbPtr->command = afpWrite;
  1719.     cbPtr->StartEndFlag = StartEndFlag;
  1720.     cbPtr->OForkRefNum = OForkRefNum;
  1721.     cbPtr->Offset = Offset;
  1722.     cbPtr->ReqCount = ReqCount;
  1723.  
  1724.     DoWrite( fCBStart, fCBSize, fRBStart, fRBSize, buffer, 0 );
  1725.     
  1726.     fActCount = cbPtr->ReqCount;
  1727.     fOffset = *(long *)fRBStart;
  1728.     
  1729.     return fErrResult;
  1730. }
  1731.  
  1732. OSErr TAFPSession::FlushFork( short OForkRefNum )
  1733. {
  1734.     struct commandBuffer {
  1735.         Byte command;
  1736.         Byte filler;
  1737.         short OForkRefNum;
  1738.     } *cbPtr;
  1739.     
  1740.     this->Debug(0, "FlushFork");
  1741.     
  1742.     fCBSize = sizeof( commandBuffer );
  1743.     fRBSize = kMinBufSize;
  1744.     cbPtr = (commandBuffer *)fCBStart;
  1745.  
  1746.     cbPtr->command = afpForkFlush;
  1747.     cbPtr->filler = '\0';
  1748.     cbPtr->OForkRefNum = OForkRefNum;
  1749.  
  1750.     return this->MakeAFPCall();
  1751. }
  1752.  
  1753. OSErr TAFPSession::ByteRangeLock( Byte StartEndFlag,
  1754.                                  short OForkRefNum,
  1755.                                  long Offset,
  1756.                                  long Length )
  1757. {
  1758.     struct commandBuffer {
  1759.         Byte command;
  1760.         Byte Flag;
  1761.         short OForkRefNum;
  1762.         long Offset;
  1763.         long Length;
  1764.     } *cbPtr;
  1765.  
  1766.     this->Debug(0, "ByteRangeLock");
  1767.     
  1768.     fCBSize = sizeof( commandBuffer );
  1769.     fRBSize = 4;
  1770.     cbPtr = (commandBuffer *)fCBStart;
  1771.  
  1772.     cbPtr->command = afpByteRangeLock;
  1773.     cbPtr->Flag = StartEndFlag;
  1774.     cbPtr->OForkRefNum = OForkRefNum;
  1775.     cbPtr->Offset = Offset;
  1776.     cbPtr->Length = Length;
  1777.     
  1778.     return this->MakeAFPCall();
  1779. }
  1780.  
  1781. OSErr TAFPSession::CloseFork( short OForkRefNum )
  1782. {
  1783.     struct commandBuffer {
  1784.         Byte command;
  1785.         Byte filler;
  1786.         short OForkRefNum;
  1787.     } *cbPtr;
  1788.  
  1789.     this->Debug(0, "CloseFork");
  1790.     
  1791.     fCBSize = sizeof( commandBuffer );
  1792.     fRBSize = kMinBufSize;
  1793.     cbPtr = (commandBuffer *)fCBStart;
  1794.  
  1795.     cbPtr->command = afpForkClose;
  1796.     cbPtr->filler = '\0';
  1797.     cbPtr->OForkRefNum = OForkRefNum;
  1798.     
  1799.     return this->MakeAFPCall();
  1800. }
  1801.  
  1802.  
  1803.  
  1804. /* Desktop Calls ----------------------------------------------------------- */
  1805.  
  1806. OSErr TAFPSession::OpenDT( short VolumeID )
  1807. {
  1808.     struct commandBuffer {
  1809.         Byte command;
  1810.         Byte filler;
  1811.         short VolumeID;
  1812.     } *cbPtr;
  1813.  
  1814.     this->Debug(0, "CloseFork");
  1815.     
  1816.     fCBSize = sizeof( commandBuffer );
  1817.     fRBSize = kMinBufSize;
  1818.     cbPtr = (commandBuffer *)fCBStart;
  1819.  
  1820.     cbPtr->command = afpDTOpen;
  1821.     cbPtr->filler = '\0';
  1822.     cbPtr->VolumeID = VolumeID;
  1823.     
  1824.     this->MakeAFPCall();
  1825.     
  1826.     fDTRefNum = *(short *)fRBStart;
  1827.     
  1828.     return fErrResult;
  1829. }
  1830.  
  1831. OSErr TAFPSession::CloseDT( short DTRefNum )
  1832. {
  1833.     struct commandBuffer {
  1834.         Byte command;
  1835.         Byte filler;
  1836.         short DTRefNum;
  1837.     } *cbPtr;
  1838.  
  1839.     this->Debug(0, "CloseDT");
  1840.     
  1841.     fCBSize = sizeof( commandBuffer );
  1842.     fRBSize = kMinBufSize;
  1843.     cbPtr = (commandBuffer *)fCBStart;
  1844.  
  1845.     cbPtr->command = afpDTClose;
  1846.     cbPtr->filler = '\0';
  1847.     cbPtr->DTRefNum = DTRefNum;
  1848.     
  1849.     return this->MakeAFPCall();
  1850. }
  1851.  
  1852. OSErr TAFPSession::AddIcon(  short DTRefNum,
  1853.                             ResType FileCreator,
  1854.                             ResType FileType,
  1855.                             Byte IconType,
  1856.                             ResType IconTag,
  1857.                             short BitmapSize,
  1858.                             Ptr IBitmapPtr )
  1859. {
  1860.     struct commandBuffer {
  1861.         Byte command;
  1862.         Byte filler;
  1863.         short DTRefNum;
  1864.         long FileCreator;
  1865.         long FileType;
  1866.         Byte IconType;
  1867.         Byte filler2;
  1868.         long IconTag;
  1869.         short BitmapSize;
  1870.     } *cbPtr;
  1871.  
  1872.     this->Debug(0, "AddIcon");
  1873.     
  1874.     fCBSize = sizeof( commandBuffer );
  1875.     fRBSize = kMinBufSize;
  1876.     cbPtr = (commandBuffer *)fCBStart;
  1877.  
  1878.     cbPtr->command = afpAddIcon;
  1879.     cbPtr->filler = '\0';
  1880.     cbPtr->DTRefNum = DTRefNum;
  1881.     cbPtr->FileCreator = FileCreator;
  1882.     cbPtr->FileType = FileType;
  1883.     cbPtr->IconType = IconType;
  1884.     cbPtr->filler2 = '\0';
  1885.     cbPtr->IconTag = IconTag;
  1886.     cbPtr->BitmapSize = BitmapSize;
  1887.     
  1888.     return DoWrite( fCBStart, fCBSize, fRBStart, fRBSize, IBitmapPtr, BitmapSize );
  1889. }
  1890.  
  1891. OSErr TAFPSession::GetIcon(    short DTRefNum,
  1892.                             ResType FileCreator,
  1893.                             ResType FileType,
  1894.                             Byte IconType,
  1895.                             short Length )
  1896. {
  1897.     struct commandBuffer {
  1898.         Byte command;
  1899.         Byte filler;
  1900.         short DTRefNum;
  1901.         long FileCreator;
  1902.         long FileType;
  1903.         Byte IconType;
  1904.         Byte filler2;
  1905.         short Length;
  1906.     } *cbPtr;
  1907.  
  1908.     this->Debug(0, "GetIcon");
  1909.     
  1910.     fCBSize = sizeof( commandBuffer );
  1911.     fRBSize = kMaxBufSize;
  1912.     cbPtr = (commandBuffer *)fCBStart;
  1913.  
  1914.     cbPtr->command = afpGetIcon;
  1915.     cbPtr->filler = '\0';
  1916.     cbPtr->DTRefNum = DTRefNum;
  1917.     cbPtr->FileCreator = FileCreator;
  1918.     cbPtr->FileType = FileType;
  1919.     cbPtr->IconType = IconType;
  1920.     cbPtr->filler2 = '\0';
  1921.     cbPtr->Length = Length;
  1922.  
  1923.     return this->MakeAFPCall();
  1924. }
  1925.  
  1926. OSErr TAFPSession::GetIconInfo( short DTRefNum,
  1927.                                 ResType FileCreator,
  1928.                                 short IconIndex )
  1929. {
  1930.     struct commandBuffer {
  1931.         Byte command;
  1932.         Byte filler;
  1933.         short DTRefNum;
  1934.         long FileCreator;
  1935.         short IconIndex;
  1936.     } *cbPtr;
  1937.  
  1938.     this->Debug(0, "GetIconInfo");
  1939.     
  1940.     fCBSize = sizeof( commandBuffer );
  1941.     fRBSize = 12;
  1942.     cbPtr = (commandBuffer *)fCBStart;
  1943.  
  1944.     cbPtr->command = afpGtIcnInfo;
  1945.     cbPtr->filler = '\0';
  1946.     cbPtr->DTRefNum = DTRefNum;
  1947.     cbPtr->FileCreator = FileCreator;
  1948.     cbPtr->IconIndex = IconIndex;
  1949.  
  1950.     return this->MakeAFPCall();
  1951. }
  1952.  
  1953. OSErr TAFPSession::AddAPPL(  short DTRefNum,
  1954.                             long DirID,
  1955.                             ResType FileCreator,
  1956.                             ResType APPLTag,
  1957.                             short PathType,
  1958.                             char * Pathname )
  1959. {
  1960.     struct commandBuffer {
  1961.         Byte command;
  1962.         Byte filler;
  1963.         short DTRefNum;
  1964.         long DirID;
  1965.         long FileCreator;
  1966.         long APPLTag;
  1967.         char marker;
  1968.     } *cbPtr;
  1969.  
  1970.     this->Debug(0, "AddAPPL");
  1971.     
  1972.     fCBSize = sizeof( commandBuffer );
  1973.     fRBSize = kMinBufSize;
  1974.     cbPtr = (commandBuffer *)fCBStart;
  1975.  
  1976.     cbPtr->command = afpAddAPPL;
  1977.     cbPtr->filler = '\0';
  1978.     cbPtr->DTRefNum = DTRefNum;
  1979.     cbPtr->DirID = DirID;
  1980.     cbPtr->FileCreator = FileCreator;
  1981.     cbPtr->APPLTag = APPLTag;
  1982.     
  1983.     fCBptr = &(cbPtr->marker);
  1984.     this->pathPush( PathType, Pathname );
  1985.  
  1986.     return this->MakeAFPCall();
  1987. }
  1988.  
  1989. OSErr TAFPSession::RemoveAPPL( short DTRefNum,
  1990.                               long DirID,
  1991.                               ResType FileCreator,
  1992.                               short PathType,
  1993.                               char * Pathname )
  1994. {
  1995.     struct commandBuffer {
  1996.         Byte command;
  1997.         Byte filler;
  1998.         short DTRefNum;
  1999.         long DirID;
  2000.         long FileCreator;
  2001.         char marker;
  2002.     } *cbPtr;
  2003.  
  2004.     this->Debug(0, "RemoveAPPL");
  2005.     
  2006.     fCBSize = sizeof( commandBuffer );
  2007.     fRBSize = kMinBufSize;
  2008.     cbPtr = (commandBuffer *)fCBStart;
  2009.  
  2010.     cbPtr->command = afpRmvAPPL;
  2011.     cbPtr->filler = '\0';
  2012.     cbPtr->DTRefNum = DTRefNum;
  2013.     cbPtr->DirID = DirID;
  2014.     cbPtr->FileCreator = FileCreator;
  2015.     
  2016.     fCBptr = &(cbPtr->marker);
  2017.     this->pathPush( PathType, Pathname );
  2018.  
  2019.     return this->MakeAFPCall();
  2020. }
  2021.  
  2022. OSErr TAFPSession::GetAPPL( short DTRefNum,
  2023.                            ResType FileCreator,
  2024.                            short APPLIndex,
  2025.                            short Bitmap )
  2026. {
  2027.     struct commandBuffer {
  2028.         Byte command;
  2029.         Byte filler;
  2030.         short DTRefNum;
  2031.         long FileCreator;
  2032.         short APPLIndex;
  2033.         short Bitmap;
  2034.     } *cbPtr;
  2035.  
  2036.     this->Debug(0, "GetAPPL");
  2037.     
  2038.     fCBSize = sizeof( commandBuffer );
  2039.     fRBSize = kMaxBufSize;
  2040.     cbPtr = (commandBuffer *)fCBStart;
  2041.  
  2042.     cbPtr->command = afpGetAPPL;
  2043.     cbPtr->filler = '\0';
  2044.     cbPtr->DTRefNum = DTRefNum;
  2045.     cbPtr->FileCreator = FileCreator;
  2046.     cbPtr->APPLIndex = APPLIndex;
  2047.     cbPtr->Bitmap = Bitmap;
  2048.     
  2049.     return this->MakeAFPCall();
  2050. }
  2051.  
  2052. OSErr TAFPSession::AddComment( short DTRefNum,
  2053.                               long DirID,
  2054.                               Byte PathType,
  2055.                                  char * Pathname,
  2056.                                  char * Comment )
  2057. {
  2058.     struct commandBuffer {
  2059.         Byte command;
  2060.         Byte filler;
  2061.         short DTRefNum;
  2062.         long DirID;
  2063.         char marker;
  2064.     } *cbPtr;
  2065.  
  2066.     this->Debug(0, "AddComment");
  2067.     
  2068.     fCBSize = sizeof( commandBuffer );
  2069.     fRBSize = kMaxBufSize;
  2070.     cbPtr = (commandBuffer *)fCBStart;
  2071.  
  2072.     cbPtr->command = afpAddCmt;
  2073.     cbPtr->filler = '\0';
  2074.     cbPtr->DTRefNum = DTRefNum;
  2075.     cbPtr->DirID = DirID;
  2076.     
  2077.     fCBptr = &(cbPtr->marker);
  2078.     this->pathPush( PathType, Pathname );
  2079.     this->alignPush();
  2080.     this->stringPush( Comment );
  2081.  
  2082.     return this->MakeAFPCall();
  2083. }
  2084.  
  2085. OSErr TAFPSession::RemoveComment( short DTRefNum,
  2086.                                  long DirID,
  2087.                                  Byte PathType,
  2088.                                  char * Pathname )
  2089. {
  2090.     struct commandBuffer {
  2091.         Byte command;
  2092.         Byte filler;
  2093.         short DTRefNum;
  2094.         long DirID;
  2095.         char marker;
  2096.     } *cbPtr;
  2097.  
  2098.     this->Debug(0, "RemoveComment");
  2099.     
  2100.     fCBSize = sizeof( commandBuffer );
  2101.     fRBSize = kMaxBufSize;
  2102.     cbPtr = (commandBuffer *)fCBStart;
  2103.  
  2104.     cbPtr->command = afpRmvCmt;
  2105.     cbPtr->filler = '\0';
  2106.     cbPtr->DTRefNum = DTRefNum;
  2107.     cbPtr->DirID = DirID;
  2108.     
  2109.     fCBptr = &(cbPtr->marker);
  2110.     this->pathPush( PathType, Pathname );
  2111.  
  2112.     return this->MakeAFPCall();
  2113. }
  2114.  
  2115. OSErr TAFPSession::GetComment( short DTRefNum,
  2116.                               long DirID,
  2117.                               Byte PathType,
  2118.                               char * Pathname )
  2119. {
  2120.     struct commandBuffer {
  2121.         Byte command;
  2122.         Byte filler;
  2123.         short DTRefNum;
  2124.         long DirID;
  2125.         char marker;
  2126.     } *cbPtr;
  2127.  
  2128.     this->Debug(0, "GetComment");
  2129.     
  2130.     fCBSize = sizeof( commandBuffer );
  2131.     fRBSize = kMaxBufSize;
  2132.     cbPtr = (commandBuffer *)fCBStart;
  2133.  
  2134.     cbPtr->command = afpGetCmt;
  2135.     cbPtr->filler = '\0';
  2136.     cbPtr->DTRefNum = DTRefNum;
  2137.     cbPtr->DirID = DirID;
  2138.     
  2139.     fCBptr = &(cbPtr->marker);
  2140.     this->pathPush( PathType, Pathname );
  2141.  
  2142.     return this->MakeAFPCall();
  2143. }
  2144.